# -*- coding:utf-8 -*-
# 推导式
# ⽤⼀个表达式创建⼀个有规律的列表或控制⼀个有规律列表。

# 列表推导式
# 书写方法：[表达式 for 变量 in 列表 if 条件]
# 创建一个空列表，追加1到10这几个数字
# for循环实现过程
# li1 = []
# for i in range(1, 11):
#     li1.append(i)
# print(li1)

# 列表推导式实现过程
# li2 = [data for data in range(1, 11)]
# print(li2)

# 带if的列表推导式
# 将1到10的偶数添加到列表中
# 方式一：利用步长实现
# li3 = [data for data in range(1, 11, 2)]
# print(li3)

# 方式二：if实现
# li3 = [data for data in range(1, 11) if data % 2 == 0]
# print(li3)

# 例子:求1到300，不能被2和7整除的数之和
# li4 = sum([data for data in range(1, 301) if data % 2 != 0 and data % 7 != 0])
# print(li4)


# 字典推导式
# 书写方法：{健：值 for 变量 in 字典.items() if 条件}

# 创建⼀个字典：字典key是1-5数字，value是这个数字的2次⽅
# dict1 = {k: k**2 for k in range(1, 6)}
# print(dict1)

# 将两个列表变为⼀个字典
# li1 = ["name", "age", "gender"]
# li2 = ["张三", 18, "男"]
# dict2 = {li1[i]: li2[i] for i in range(len(li2))}
# print(dict2)

# 提取字典中⽬标数据
# 需求：提取上述电脑数量⼤于等于200的字典数据
# computers = {'AUC': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
# dict3 = {key: value for key, value in computers.items() if value >= 200}
# print(dict3)


# 集合推导式
# 书写方法：{表达式 for 变量 in 集合 if 条件}

# 计算数字 1,2,3 的平方数
set1 = {i**2 for i in range(1, 4)}
print(set1)    # {1, 4, 9}

# 'abracadabra' 输出非abc的字母
set2 = {i for i in 'abracadabra' if i not in "abc"}
print(set2)     # {'d', 'r'}


# 元组推导式
# 书写方法：(表达式 for 变量 in 元组 if 条件)

# 生成包含1到9数字的元组
tu1 = (data for data in range(1, 10))
# print(tu1)    # 返回的是生成器对象 # <generator object <genexpr> at 0x000002BAC48E4F90>

# 使用 tuple() 函数，可以直接将生成器对象转换成元组
print(tuple(tu1))

